package com.wf.classRoomTest.jvm;

import java.io.BufferedWriter;
import java.lang.reflect.Field;

public class TestPerson {

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        // 创建一个Person对象
        Person person = new Person("Alice", 30);

        // 使用反射获取Person类的Class对象
        Class<?> personClass = person.getClass();

        // 获取Person类的成员变量（字段）
        Field nameField = personClass.getDeclaredField("name");
        Field ageField = personClass.getDeclaredField("age");

        // 打印对象的内存布局信息
        System.out.println("Person对象的内存布局信息：");

        // 打印对象头部分
        long headerSize = 16; // 假设对象头部分占据16字节
        System.out.println("对象头部分（Header）：");
        System.out.println("  Mark Word: " + "假设此处打印Mark Word的具体信息");
        System.out.println("  Class Metadata Address: " + "假设此处打印Class Metadata Address的具体信息");
        System.out.println("  总大小: " + headerSize + " 字节");

        // 打印实例数据部分
        long nameFieldSize = 8; // 假设name字段的引用大小为8字节
        long ageFieldSize = 4; // 假设age字段的大小为4字节
        long instanceDataSize = nameFieldSize + ageFieldSize;
        System.out.println("实例数据部分（Instance Data）：");
        System.out.println("  name字段大小: " + nameFieldSize + " 字节");
        System.out.println("  age字段大小: " + ageFieldSize + " 字节");
        System.out.println("  总大小: " + instanceDataSize + " 字节");

        // 打印填充部分
        long paddingSize = 8; // 假设填充部分占据8字节（为了对齐）
        System.out.println("填充部分（Padding）：");
        System.out.println("  大小: " + paddingSize + " 字节");

        // 计算总大小
        long totalSize = headerSize + instanceDataSize + paddingSize;
        System.out.println("总大小（Total Size）：");
        System.out.println("  总大小: " + totalSize + " 字节");

        // 打印Person对象的具体信息
        System.out.println("\nPerson对象的具体信息：");
        System.out.println("  name字段: " + nameField.get(person));
        System.out.println("  age字段: " + ageField.getInt(person));
    }
}
